Haluatko parantaa tätä viestiä? Anna yksityiskohtaiset vastaukset tähän kysymykseen, mukaan lukien sitaatit ja selitys miksi vastauksesi on oikea. Vastauksia, joissa ei ole riittävästi yksityiskohtia, voidaan muokata tai poistaa. Lisäsin tiedostot vahingossa Gitiin komennolla: git lisää myfile.txt En ole vielä suorittanut sitoutumista. Onko mahdollista kumota tämä, joten näitä tiedostoja ei sisällytetä sitoutumiseen?
2020-12-07 21:20:50
1 2 Seuraava Voit kumota git add ennen sitoutumista git resetjoka poistaa sen nykyisestä hakemistosta ("sitoutuu" -luettelosta) muuttamatta mitään muuta. Voit käyttää git nollaus ilman mitään tiedostonimeä kaikkien tarvittavien muutosten poistamiseksi. Tästä voi olla hyötyä, kun tiedostoja on liian monta, jotta ne voidaan luetella yksitellen kohtuullisessa ajassa. Gitin vanhoissa versioissa yllä olevat komennot vastaavat git reset HEAD ja git reset HEAD vastaavasti ja epäonnistuvat, jos HEAD on määrittelemätön (koska et ole vielä tehnyt mitään muutoksia arkistossa) tai epäselvä (koska loi haaran nimeltä HEAD, joka on tyhmä asia, jota sinun ei pitäisi tehdä). Tätä muutettiin kuitenkin Git 1.8.2: ssa, joten Gitin nykyaikaisissa versioissa voit käyttää yllä olevia komentoja jo ennen ensimmäisen sitoutumisen tekemistä: "git reset" (ilman vaihtoehtoja tai parametreja) käytetään virheilmoitukseen milloin sinulla ei ole historiassasi mitään sitoumuksia, mutta se antaa sinulle nyt tyhjä hakemisto (vastaamaan olematonta sitoutumista et ole edes päällä). Dokumentaatio: git reset | Haluat: git rm - välimuisti Perustelut: Kun olin uusi tässä, yritin ensin git nollaus. (kumoamaan koko alkuperäisen lisäyksen), vain saadaksesi tämän (ei niin) hyödyllisen viestin: kohtalokas: 'HEAD' ei ratkennut kelvollisena viitteenä. On käynyt ilmi, että tämä johtuu siitä, että HEAD-viite (haara?) On olemassa vasta ensimmäisen sitoutumisen jälkeen. Eli kohtaat saman aloittelijan ongelman kuin minä, jos työnkulkumme, kuten minunkin, olisi jotain: cd uuteen upeaan projektihakemistooni kokeilemaan uutta kuumuutta Git git init git lisää. git-tila ... paljon paskaa vierittää ... => Hitto, en halunnut lisätä kaikkea sitä. google "kumoa git-lisäys" => etsi Stack Overflow - yay git nollaus. => kohtalokas: 'HEAD': n ratkaiseminen kelvollisena viitteenä epäonnistui Lisäksi osoittautuu, että postituslistalla on virhe, joka on kirjattu tämän hyödyttömyydestä. Ja että oikea ratkaisu oli oikeassa siellä Git-tilaulostulossa (joka kyllä, minä kiillotin "paska") ... # Tehdyt muutokset: # (käytä "git rm --cached ..." lavalle) ... Ja ratkaisu on todellakin käyttää git rm -välimuistitiedostoa. Huomaa varoitukset muualla täällä - git rm poistaa tiedoston paikallisen työkopion, mutta ei, jos käytät --cached. Tässä on git help rm -tulos: - välimuisti Käytä tätä vaihtoehtoa poistaaksesi vaiheet ja poistaaksesi polut vain hakemistosta. Toimivat puutiedostot, riippumatta siitä, onko niitä muokattu vai ei, jätetään. Jatkan käyttöä git rm - välimuisti. Poista kaikki ja aloita uudestaan. Ei toiminut, koska vaikka lisää. on rekursiivinen, osoittautuu, että rm tarvitsee -r: n toistumaan. Huokaus. git rm -r - välimuisti. Okei, nyt olen palannut alkuun. Seuraavan kerran aion käyttää -n: tä kuivakäyntiin ja nähdä, mitä lisätään: git add -n. Pakkasin kaiken turvalliseen paikkaan, ennen kuin luotin siihen, että välimuisti ei tuhoa mitään (ja mitä jos kirjoitin väärin). | Jos kirjoitat: git-tila Git kertoo sinulle, mitä järjestetään jne., Mukaan lukien ohjeet lavasta poistumiseen: käytä "git reset HEAD ..." poistuaksesi lavasta Minusta Git tekee melko hyvää työtä työntämällä minua tekemään oikean asian tällaisissa tilanteissa. Huomaa: Viimeaikaiset Git-versiot (1.8.4.x) ovat muuttaneet tätä viestiä: (poista lavasta "git rm --cached ...") | Selvennykseksi: git add siirtää muutokset nykyisestä työhakemistosta lavastusalueelle (hakemisto). Tätä prosessia kutsutaan lavastukseksi. Joten luonnollisin komento muutosten (muutettujen tiedostojen) vaiheistamiseksi on ilmeinen: git-vaihe git add on vain helpompi kirjoittaa alias git-vaiheelle Sääli, ettei ole git unstage- tai git undd -komentoja. Asiaa on vaikea arvata tai muistaa, mutta se on melko ilmeinen: git reset HEAD - Voimme helposti luoda aliaksen tälle: git config --global alias.unadd 'nollaa HEAD -' git config --global alias.unstage 'reset HEAD -' Ja lopuksi meillä on uudet komennot: git lisää tiedosto 1 git-vaihetiedosto 2 git undd-tiedosto 2 git-vaiheittainen tiedosto 1 Henkilökohtaisesti käytän vielä lyhyempiä aliaksia: git a # Lavastusta varten git u # Pysähtymättömäksi | Lisäys hyväksyttyyn vastaukseen, jos virheellisesti lisätty tiedosto oli valtava, huomaat todennäköisesti, että vaikka poistaisit sen hakemistosta 'git reset' -toiminnolla, se näyttää silti vievän tilaa .git-hakemistossa. Tämä ei ole mikään huolestuttava; tiedosto on todellakin edelleen arkistossa, mutta vain "löysänä objektina". Sitä ei kopioida muihin arkistoihin (kloonin, pushin kautta), ja tila lopulta otetaan talteen - vaikkakaan ei kovin pian. Jos olet ahdistunut, voit juosta: git gc --prune = nyt Päivitys (seuraava on yritys yrittää poistaa hämmennys, joka voi syntyä eniten äänestetyistä vastauksista): Joten mikä on git addin todellinen kumoaminen? git reset HEAD ? tai git rm - välimuisti ? Tarkkaan ottaen, ja jos en erehdy: ei ketään. git addia ei voi kumota - yleensä turvallisesti. Muistetaan ensin, mitä git add todella tekee: Jos ei aiemmin seurattu, git add lisää senvälimuisti ja sen nykyinen sisältö. Jos oli jo seurattu, git add tallentaa nykyisen sisällön (tilannekuvan, version) välimuistiin. Gitissä tätä toimintoa kutsutaan edelleen addiksi (ei pelkästään päivitä sitä), koska tiedoston kahta erilaista versiota (tilannevedosta) pidetään kahtena eri kohteena: näin ollen lisäämme välimuistiin todellakin uuden kohteen, joka on lopulta tehty myöhemmin. Tämän valossa kysymys on hieman epäselvä: Lisäsin tiedostot vahingossa komennolla ... OP: n skenaario näyttää olevan ensimmäinen (jäljittämätön tiedosto), haluamme, että "kumoa" poistaa tiedoston (ei vain nykyisen sisällön) seuratuista kohteista. Jos näin on, on hyvä suorittaa git rm --cached . Ja voisimme myös suorittaa git reset HEAD . Tämä on yleensä suositeltavaa, koska se toimii molemmissa tilanteissa: se myös kumoa, kun lisäsimme väärin jo seuratun kohteen version. Mutta on olemassa kaksi varoitusta. Ensimmäinen: On (kuten vastauksessa todettiin) vain yksi skenaario, jossa git reset HEAD ei toimi, mutta git rm --cached toimii: uusi arkisto (ei sitoumuksia). Mutta oikeastaan tämä on käytännössä merkityksetön tapaus. Toinen: Huomaa, että git reset HEAD ei voi maagisesti palauttaa aiemmin välimuistissa olevan tiedoston sisällön, vaan se vain synkronoi sen uudelleen HEADista. Jos väärä git-lisäyksemme kirjoitti aikaisemman vaiheittaisen sitomattoman version, emme voi palauttaa sitä. Siksi emme voi tiukasti ottaen kumota [*]. Esimerkki: $ git init $ echo "version 1"> tiedosto.txt $ git add file.txt # Lisää ensin tiedosto.txt $ git sitoutuminen -m 'ensimmäinen sitoutuminen' $ echo "version 2"> tiedosto.txt $ git add file.txt # Vaihe (älä sitoudu) file.txt: n "versio 2" $ git diff --välimuisti tiedosto.txt -versio 1 + versio 2 $ echo "version 3"> tiedosto.txt $ git diff tiedosto.txt -versio 2 + versio 3 $ git add file.txt # Hups, emme tarkoittaneet tätä $ git reset HEAD file.txt # Kumotaanko? $ git diff --cached file.txt # Ei tietenkään eroa. vaihe == PÄÄ $ git diff file.txt # "versio 2" on peruuttamattomasti kadonnut -versio 1 + versio 3 Tämä ei tietenkään ole kovin kriittistä, jos noudatamme tavallista laiskaa työnkulkua, jossa 'git add' tehdään vain uusien tiedostojen lisäämiseksi (tapaus 1), ja päivitämme uuden sisällön komennolla sitoutu, git sitoutu -a. * (Muokkaa: yllä oleva on käytännössä oikein, mutta silti voi olla joitain hakkerisia / mutkikkaita tapoja palauttaa vaiheitetut, mutta sitoutumattomat ja sitten korvatut muutokset - katso Johannes Matokicin ja iolsmitin kommentit) | Git: llä on melko helppoa kumota jo lisätty tiedosto. Käytä jo lisättyjä myfile.txt-tiedostojen palauttamiseen: git reset HEAD myfile.txt Selitys: Kun olet lavastanut ei-toivotut tiedostot, voit kumota ne tekemällä git-palautuksen. Head on tiedostosi pää paikallisessa ja viimeinen parametri on tiedostosi nimi. Olen luonut alla olevan kuvan vaiheet tarkemmin sinulle, mukaan lukien kaikki vaiheet, joita voi tapahtua näissä tapauksissa: | git rm - välimuisti. -r "poistaa" kaiken nykyiseen hakemistoon lisäämäsi rekursiivisesti | Juosta git gui ja poista kaikki tiedostot manuaalisesti tai valitsemalla ne kaikki ja napsauttamalla unstage fromaksid -painiketta. | Kysymystä ei esitetä selvästi. Syynä on se, että git addilla on kaksi merkitystä: lisäämällä uusi tiedosto lavastusalueelle ja kumoamalla sitten git rm - välimuistitiedosto. lisäämällä muokattu tiedosto lavastusalueelle ja kumoamalla sitten git reset HEAD -tiedosto. Jos olet epävarma, käytä git nollaa HEAD-tiedosto Koska se tekee odotetun asian molemmissa tapauksissa. Varoitus: jos teet git rm - välimuistitiedoston muokatulle tiedostolle (tiedosto, joka oli aiemmin olemassa arkistossa), tiedosto poistetaan git commitista! Se on edelleen olemassa tiedostojärjestelmässäsi, mutta jos joku muu vetää sitoutumisesi, tiedosto poistetaan heidän työpuunsa. git-tila kertoo, oliko tiedosto uusi tiedosto vai muokattuko se: Haaratoimistossa Tehdyt muutokset: (poistu lavasta käyttämällä "git reset HEAD ...") uusi tiedosto: my_new_file.txt muokattu: my_modified_file.txt | Gitillä on käskyjä jokaiselle kuviteltavalle toiminnalle, mutta se tarvitsee laajaa tietoa saadakseen asiat oikein ja siksi se on parhaimmillaankin intuitiivista ... Mitä teit aiemmin: Muutti tiedostoa ja käytti git add. Tai git add . Mitä sinä haluat: Poista tiedosto hakemistosta, mutta pidä se versiona ja jätä tekemättä muutoksia työkopioon: git reset HEAD Palauta tiedosto viimeiseen tilaan HEADista, kumoamalla muutokset ja poistamalla ne hakemistosta: # Ajattele `svn revert ` IIRC. git reset HEAD git checkout # Jos sinulla on ` ` niminen kuten , käytä: git-kassa - Tätä tarvitaan, koska git reset --hard HEAD ei toimi yksittäisten tiedostojen kanssa. Poista hakemistosta ja versiosta pitämällä versioton tiedosto muutoksineen työkopiossa: git rm - välimuisti Poista työkopiosta ja versiosta kokonaan: git rm | Jos olet tekemässä alkuperäistä sitoutumistasi etkä voi käyttää git-tiedostoapalauta, julista vain "konkurssi", poista .git-kansio ja aloita alusta | Kuten monissa muissa vastauksissa, voit käyttää git reset -toimintoa MUTTA: Löysin tämän suuren pienen viestin, joka todella lisää Git-komennon (hyvin, aliaksen) git unadd: katso lisätietoja git unadd tai .. Yksinkertaisesti, git config --global alias.unadd "reset HEAD" Nyt voit git unadd foo.txt bar.txt | Käytä git add -i poistaaksesi juuri lisätyt tiedostot tulevasta sitoutumisesta. Esimerkki: Halutun tiedoston lisääminen: $ git lisää foo $ git-tila # Haaran päällikkö # Tehdyt muutokset: # (käytä "git reset HEAD ..." poistuaksesi lavasta) # # uusi tiedosto: foo # # Seurattavat tiedostot: # (käytä "git add ..." sisällyttääksesi mitä sitoudutaan) # [...] # Siirtyminen interaktiiviseen lisäykseen kumoamisen lisäämiseksi (git: llä kirjoitetut komennot ovat "r" (palautus), "1" (luettelon palautuksen ensimmäinen merkintä näkyy), "palaa" palataksesi pois palautustilasta ja "q" (lopettaa): $ git lisää -i lavastettu vaiheittainen polku 1: + 1 / -0 ei mitään *** Komennot *** 1: [s] tila 2: [u] pdate 3: [r] evert 4: [a] dd jäljittämätön 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Mitä nyt> r lavastettu vaiheittainen polku 1: + 1 / -0 mitään [f] oo Palauta >> 1 lavastettu vaiheittainen polku * 1: + 1 / -0 ei mitään [f] oo Palauta >> Huomaa: foo on nyt jäljittämättä. palasi yhden polun *** Komennot *** 1: [s] tila 2: [u] pdate 3: [r] evert 4: [a] dd jäljittämätön 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Mitä nyt> q Hei hei. $ Se siitä! Tässä on todisteesi siitä, että "foo" on palannut jäljittelemättömään luetteloon: $ git-tila # Haaran päällikkö # Seurattavat tiedostot: # (käytä "git add ..." sisällyttääksesi mitä sitoudutaan) # [...] # foo mitään ei lisätty sitoutumiseen, mutta jäljittämätön tiedosto on olemassa (käytä "git add" seurantaan) $ | git remove tai git rm voidaan käyttää tähän, - välimuisti-lipun kanssa. Yrittää: git help rm | Näin voit välttää tämän tuskallisen ongelman, kun aloitat uuden projektin: Luo uuden hakemistosi päähakemisto. Suorita git init. Luo nyt .gitignore-tiedosto (vaikka se olisi tyhjä). Suorita .gitignore-tiedostosi. Git tekee todella vaikeaksi tehdä git reset, jos sinulla ei ole mitään tekemistä. Jos luot pienen alkusitoumuksen vain sen saamiseksi, voit sen jälkeen lisätä -A: n ja nollata niin monta kertaa kuin haluat saada kaikki oikein. Toinen menetelmän etu on, että jos kohtaat myöhemmin rivinvaihtoon liittyviä ongelmia ja sinun on päivitettävä kaikki tiedostosi, se on helppoa: Tarkista alkuperäinen sitoutuminen. Tämä poistaa kaikki tiedostosi. Tarkista sitten viimeisin sitoumus uudelleen. Tämä noutaa tuoreet kopiot tiedostoistasi nykyisten rivin lopetusasetusten avulla. | Ehkä Git on kehittynyt sen jälkeen kun lähetit kysymyksesi. $> git --versio git-versio 1.6.2.1 Nyt voit kokeilla: git reset HEAD. Tämän pitäisi olla etsimäsi. | Huomaa, että jos et määritä versiota, sinun on sisällytettävä erotin. Esimerkki konsoliltani: git reset fatal: epäselvä argumentti ' ': tuntematon versio tai polku ei ole työpuussa. Käytä - - erottaaksesi polut versioista git reset - Vaiheettomat muutokset kuittauksen jälkeen: M (Git-versio 1.7.5.4) | Uusien tiedostojen poistaminen lavastusalueelta (ja vain uuden tiedoston tapauksessa), kuten edellä ehdotettiin: git rm - välimuistitiedosto Käytä rm --cached vain vahingossa lisättyihin uusiin tiedostoihin. | Voit nollata jokaisen tiedoston tietyssä kansiossa (ja sen alikansioissa) käyttämällä seuraavaa komentoa: git reset * | Käsittele useita tiedostoja kerralla * -komennolla: git reset HEAD * .prj git reset HEAD * .bmp git reset HEAD * gdb * jne. | Kirjoita vain git reset, se palaa takaisin ja se on kuin et koskaan kirjoittanut git add. viimeisestä sitoutumisestasi. Varmista, että olet sitoutunut aikaisemmin. | Oletetaan, että luon uuden tiedoston newFile.txt: Oletetaan, että lisätään tiedoston vahingossa, git lisää newFile.txt: Nyt haluan kumota tämän lisäyksen, ennen sitoutumista, git reset newFile.txt: | Tietty tiedosto: git palauta my_file.txt git checkout my_tiedosto.txt Kaikki lisätyt tiedostot: git nollaus. git kassalla. Huomaa: kassa muuttaa tiedostojen koodia ja siirtyy viimeksi päivitettyyn (sitoutuneeseen) tilaan. nollaus ei muuta koodeja; se vain nollaa otsikon. | Voit kumota git add -toiminnon seuraavasti: git reset tiedostonimi | Tämä komento poistaa muutokset: git nollaa HEAD-tiedostonimi.txt Voit myös käyttää git add -p lisätä tiedostojen osia. | On myös interaktiivinen tila: git add -i Voit poistaa tiedostoja valitsemalla vaihtoehdon 3. Minun tapauksessani haluan usein lisätä useamman kuin yhden tiedoston, ja interaktiivisessa tilassa voit käyttää tällaisia numeroita tiedostojen lisäämiseen. Tämä vie kaikki paitsi 4: 1, 2, 3 ja 5 Jos haluat valita jakson, kirjoita vain 1-5, jos haluat ottaa kaikki väliltä 1-5. Git lavastustiedostot | git add myfile.txt # Tämä lisää tiedostosi tehtäväluetteloon Melko päinvastainen kuin tämä komento on, git reset HEAD myfile.txt # Tämä kumoase. Joten, olet edellisessä tilassa. Määritetty on jälleen jäljittämättömässä luettelossa (edellinen tila). Se nollaa pään tällä määritetyllä tiedostolla. joten jos pääsi ei ole sitä tarkoittaa, se yksinkertaisesti nollaa sen. | git reset tiedostonimi.txt Poistaa tiedoston nimeltä tiedostonimi.txt nykyisestä hakemistosta, "sitoutumassa" -alueelta muuttamatta mitään muuta. | git reset tiedostonimi.txt Poistaa tiedoston nimeltä tiedostonimi.txt nykyisestä hakemistosta, "sitoutumassa" -alueesta muuttamatta mitään muuta. | Sourcetree-palvelussa voit tehdä tämän helposti käyttöliittymän kautta. Voit tarkistaa, mitä komentoa Sourcetree käyttää tiedoston poistamiseen. Loin uuden tiedoston ja lisäsin sen Gitiin. Sitten poistin sen lavasta Sourcetree-käyttöliittymällä. Tämä on tulos: Tiedostojen vaiheittainen purkaminen [12.12.2015 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - polku / tiedostoon / tiedostonimi.java Sourcetree käyttää reset-tiedostoa uusien tiedostojen vaiheistamiseen. | 1 2 Seuraava Erittäin aktiivinen kysymys. Ansaitse 10 mainetta vastaamiseksi tähän kysymykseen. Maineen vaatimus auttaa suojaamaan tätä kysymystä roskapostilta ja vastaamattomuudelta. Eikö vastausta etsit? Selaa muita kysymyksiä, jotka on merkitty koodilla git version-control git-sitoutu git-vaihe tai kysy oma kysymyksesi.